package br.com.damazzy.negocio.persistencia.dao;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.com.damazzy.conexao.Conexao;
import br.com.damazzy.negocio.entidade.TipoProduto;

public class TipoProdutoDaoImpl implements TipoProdutoDao {

	public TipoProduto alterar(TipoProduto objeto) throws Exception {
		
		Connection conn = null;
		PreparedStatement ps = null;
		int cont = 1;
		
		try {
			conn = Conexao.criarConexao();
			
			StringBuffer sql = new StringBuffer();
			sql.append("update damazzy.tipoproduto set descricao = ? where idtipoproduto = ?");
			
			ps = conn.prepareStatement(sql.toString());
			ps.setString(cont++, objeto.getDescricao());
			ps.setInt(cont++, objeto.getIdTipoProduto());
			
			ps.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Erro ao alterar o tipo de produto.");
		} finally {
			Conexao.fecharConexao(conn);
		}
		
		return this.obter(objeto.getIdTipoProduto());
	}

	public void excluir(Serializable chave) throws Exception {
		
		Connection conn = null;
		PreparedStatement ps = null;
		
		try {
			conn = Conexao.criarConexao();
			
			StringBuffer sql = new StringBuffer();
			sql.append("delete from damazzy.tipoproduto where idtipoproduto = ?");
			
			ps = conn.prepareStatement(sql.toString());
			
			Integer id = (Integer) chave;
			ps.setInt(1, id);
			
			ps.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Erro ao excluir o tipo de produto.");
		} finally {
			Conexao.fecharConexao(conn);
		}
	}

	public TipoProduto incluir(TipoProduto objeto) throws Exception {

		Connection conn = null;
		PreparedStatement ps = null;
		int cont = 1;
		
		try {
			conn = Conexao.criarConexao();
			
			StringBuffer sql = new StringBuffer();
			sql.append("insert into damazzy.tipoproduto (descricao) values (?)");
			
			ps = conn.prepareStatement(sql.toString());
			ps.setString(cont++, objeto.getDescricao());
			
			ps.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Erro ao incluir o tipo de produto.");
		} finally {
			Conexao.fecharConexao(conn);
		}
		
		return null;
	}

	public List<TipoProduto> listar() throws Exception {
		return this.pesquisar(new TipoProduto());
	}

	public TipoProduto obter(Serializable chave) throws Exception {
		
		TipoProduto tipoProduto = null;
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			conn = Conexao.criarConexao();
			
			StringBuffer sql = new StringBuffer();
			sql.append("select * from damazzy.tipoproduto where idtipoproduto = ?");
			
			ps = conn.prepareStatement(sql.toString());
			
			Integer id = (Integer) chave;
			ps.setInt(1, id);
			
			rs = ps.executeQuery();
			
			if (rs.next()) {
				tipoProduto = new TipoProduto();
				
				tipoProduto.setIdTipoProduto(rs.getInt("idtipoproduto"));
				tipoProduto.setDescricao(rs.getString("descricao"));
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Erro ao obter o tipo de produto.");
		} finally {
			Conexao.fecharConexao(conn);
		}
		
		return tipoProduto;
	}

	public List<TipoProduto> pesquisar(TipoProduto objeto) throws Exception {
		
		TipoProduto tpFiltro = objeto;
		TipoProduto tipoProduto;
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<TipoProduto> tiposProduto = new ArrayList<TipoProduto>();
		
		try {
			conn = Conexao.criarConexao();
			
			StringBuffer sql = new StringBuffer();
			sql.append("select * from damazzy.tipoproduto where 1 = 1 ");
			
			if (tpFiltro.getDescricao() != null) {
				sql.append("and descricao like '%" + tpFiltro.getDescricao() + "%'");
			}
			
			sql.append(" order by descricao");
			
			ps = conn.prepareStatement(sql.toString());
			rs = ps.executeQuery();
			
			while (rs.next()) {
				tipoProduto = new TipoProduto();
				
				tipoProduto.setIdTipoProduto(rs.getInt("idtipoproduto"));
				tipoProduto.setDescricao(rs.getString("descricao"));
				
				tiposProduto.add(tipoProduto);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Erro ao pesquisar os tipos de produto.");
		} finally {
			Conexao.fecharConexao(conn);
		}
		
		return tiposProduto;
	}
}
